Wt3.2.3文档翻译:Wt::Dbo::Session类参考,Wt::Dbo::Session Class Reference
template<class C , typename BindStrategy >
( |
const std::string & |
condition = std::string() |
) |
查找数据库对象。
此方法创建一个查询对象,用于查找类型为 C的数据库对象。
当传入的condition 参数为空字符串时,它会返回所有类型为 C的数据库对象。否则,它会加入查询条件,加入的手段就是生成一个结构化查询语言(SQL)的where 子句。
BindStrategy指定的是,(如果有查询条件的话,)如何将查询条件绑定到妳的查询对象中。
当使用动态绑定( DynamicBinding )(这是默认值)时,绑定过程将是异步的(defer),直到查询对象被运行时才会真正绑定。这会带来一些好处:妳可以使用这个查询对象中提供的辅助函数来构造出查询定义条件;妳可以保留这个查询对象,并且多次运行它,每次可使用不同的参数值,或者在查询结果中遍历。
当使用直接绑定( DirectBinding )时,该查询对象必须整个都使用查询条件condition 构造完成,并且只能运行一次。这种方式的好处是,参数会直接绑定到底层的预准备的语句中去。
当妳只是想从单个表中查询结果的时候,这种方法是狠方便的。要想进行更通用的查询,就参考query()。
使用示例:
// Bart不见了,让我们找到他。
Wt::Dbo::ptr<User> bart = session.find<User>().where("name = ?").bind("Bart");
// 查找所有用户,按照名字排序
typedef Wt::Dbo::collection< Wt::Dbo::ptr<User> > Users;
Users users = session.find<User>().orderBy("name");
在condition 中,可使用'?'作为占位符来绑定参数:其中出现的每个'?' (作为一个字面(lexical)符号)都会被一个绑定的参数替换。这个过程实际上是由大部分后端自行完成的,它们实现这个功能的手段就是预准备的语句和参数绑定。对于任何针对sql_value_traits 做过模板特化(specialized)的类型,都可以使用参数绑定。
参考:
template<class C >
void Wt::Dbo::Session::mapClass |
( |
const char * |
tableName |
) |
将一个类映射到一个数据库表上。
C 这个类会被映射到一个名为tableName 的表上。妳必须将类映射到表上去 。
如果底层的数据库支持按模式限制的(schema-qualified)表名的话,妳就可以使用这种形式的表名,例如 : "myschema.users" 。
template<class Result , typename BindStrategy >
Query< Result, BindStrategy > Wt::Dbo::Session::query |
( |
const std::string & |
sql |
) |
创建一个查询对象。
这里的结构化查询语言(sql)语句应当是一个完整的结构化查询语言语句,以"select "开头。在"select"中列出的那些条目必须与Result 的类型匹配。对应于一个数据库对象(ptr)的条目将会被dbo 中所有字段的选择结果(selection)替换掉。
例如,以下的这个查询对象(User类被映射到数据表'user'):
session.query< ptr<User> >("select u from user u").where("u.name = ?").bind("Bart");
是以下代码的更通用版本:
session.find<User>().where("name = ?").bind("Bart");
注意,这个查询对象中的"u"会被展开为选择user 这个表中的所有字段(u.id、u.version、u.name……)。当妳在Query::groupBy()中使用别名(alias)的时候,也会发生这种展开过程。
相对于find(),query()能够提供的灵活性就在于它能够支持其它的结果类型。
因此,它可能返回基本(plain)值:
session.query<int>("select count(1) from ...");
或者Boost.Tuple,表示一种由任意类型的结果值产生的组合:
session.query< boost::tuple<int, int> >("select A.id, B.id from table_a A, table_b B").where("...");
一个元组(tuple)能将任何可作为结果的类型组合起来,包括数据库对象(参考ptr_tuple):
session.query< boost::tuple<ptr<A>, ptr<B> > >("select A, B from table_a A, table_b B").where("...");
BindStrategy指定的是如何将参数(如果有的话)绑定到妳的查询对象中。
如果使用动态绑定( DynamicBinding )(默认值)的话,参数与实际结构化查询语言 (sql)语句之间的绑定是延迟发生的 ,直到查询真正执行的时候才绑定。 这会带来一些好处:妳可以使用这个 查询对象 中提供的辅助函数来构造出查询定义条件;妳可以保留这个查询对象,并且多次运行它,每次可使用不同的参数值,或者在查询结果中遍历。
当使用直接绑定( DirectBinding )时,查询条件必须完整地使用sql 来指定,并且只能被执行一次。这种方式的好处是,参数会直接绑定到底层的预准备的语句中去。
此方法使用query_result_traits 来将查询结果填充(unmarshal)到Result 类型中去。
在这个sql 查询中,参数可以用'?'作为占位符来绑定:其中出现的每个'?'(作为字面符号)都会被替换为一个绑定的参数。这个过程实际上是由大部分后端自行完成的,它们实现这个功能的手段就是预准备的语句和参数绑定。对于任何针对sql_value_traits 做过模板特化(specialized)的类型,都可以使用参数绑定。
注意:
查询语句必须是一个7位美国标准信息交换码(ASCII-7) 字符串:底层的查询语句分析器是不支持UTF-8 的。要想将非英文的字符串加入到查询语句中去的话,就应当使用参数绑定(它同时还能防止结构化查询语言注射攻击),而不是使用字符串拼接。
李颖
富士康
朱丽倩
未知美女
HxLauncher: Launch Android applications by voice commands